// 1. 导入axios
import axios from "axios";
import { Toast } from "vant";
import store from "@/store";
import router from "@/router";

// 2. 调用axos.create得到axios的实例对象
const request = axios.create({
    baseURL: 'http://toutiao.itheima.net'
})

// 添加请求拦截器
request.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    // 1. 判断当前vuex中有没有token
    const user = store.state.user
    // 3. 如果有就给 config.headers  也就是请求头的配置项
    if (user && user.token && !config.headers.Authorization) {
        config.headers.Authorization = `Bearer ${store.state.user.token}`
    }
    // 2. 如果没有啥事不干
    return config
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 添加响应拦截器
request.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 拿到大的响应对象之后，取出其中响应体的部分，返回给调用方
    // 对响应数据做点什么
    return response.data || response
}, async function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    if (error.response) {
        if (error.response.status === 401) {
            // 判断响应状态码是不是401，如果是401, 就代表token过期了，就要进行token过期处
            const user = store.state.user
            if (user && user.refresh_token) {
                // 2. 如果有refresh_token, 就要使用refresh_token调刷新token的接口，获取最新的token
                try {
                    const res = await request({
                        method: 'PUT',
                        url: '/v1_0/authorizations',
                        headers: {
                            Authorization: `Bearer ${user.refresh_token}`
                        }
                    })
                    // 2.1. 如果调刷新token的接口成功了，就拿最新的token, 更新替换过期的token
                    store.commit('setUser', {
                        token: res.data.token,
                        refresh_token: user.refresh_token
                    })
                    // 2.2. 拿着原来调接口的信息，重新调接口，拿到数据返回给原调用方
                    error.config.headers.Authorization = ''
                    return request(error.config)
                } catch (err) {
                    // 3. 如果调刷新token的接口失败就说明refresh_token过期，就清空token，并跳转到登录页
                    // 清空token & 跳转到登录页
                    store.commit('setUser', null)
                    router.push('/login')
                }
            } else {
                store.commit('setUser', null)
                router.push('/login')
            }
        }
        Toast.fail(error.response.data.message);
    } else {
        Toast.fail("网络异常");
    }
    return Promise.reject(error);
});



export default request